package com.apes.fn.crm.customComplain;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.apes.framework.api.DomainService;
import com.apes.framework.plugin.esb.api.SimpleRequest;
import com.apes.framework.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;

@Service("fnCustomComplainReportService")
public class FnCustomComplainReportService extends DomainService {

    @Autowired
    FnCustomComplainReportDao customComplainReportDao;


    /***
     * 客诉处理效率-门店(周期)
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  TOTAL 单量
     *  HANDLED 已处理
     *  AVERAGE_HANDLED_CONSUME 平均耗时（分钟,两位小数）
     */
    public JSONArray customPlainHandleEfficiencyDept(SimpleRequest request){

        JSONObject param = request.getJO();

        checkNull(param, "DEPT_ID", "DATE_START", "DATE_END");

        return customComplainReportDao.customPlainHandleEfficiencyDept(param);
    }

    /***
     * 客诉处理效率-人员(单月)
     * 参数：
     *  DATE_END 下月
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  OPERATOR_NAME 人员名称
     *  AVERAGE_CONSUME 平均耗时
     *  TASK 任务数
     */
    public JSONArray customPlainHandleEfficiencyPerson(SimpleRequest request){
        JSONObject param = request.getJO();

        addPrevMonthString(param, "DATE_END");
        checkNull(param,"DATE_END","DATE_START");

        return customComplainReportDao.customPlainHandleEfficiencyPerson(param);
    }


    /***
     * 客诉数量 + 平均耗时
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  DISPOSE_NUM 处理中
     *  STOP_NUM 停单中
     *  END_NUM 已结单
     *  AVERAGE_CONSUME 平均耗时
     */
    public JSONArray customPlainCountAndConsume(SimpleRequest request){

        JSONObject param = request.getJO();

        checkNull(param, "DEPT_ID", "DATE_START", "DATE_END");

        return customComplainReportDao.customPlainCountAndConsume(param);
    }


    /***
     * 结单客诉满意率
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  DATE_END 下月
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  COMMON_NUM 一般
     *  SATISFY_NUM 满意
     *  VERY_SATISFY_NUM 满意
     *  UNSATISFY_NUM 不满意
     *  VERY_UNSATISFY_NUM 非常不满意
     */
    public JSONArray customPlainSatisfaction(SimpleRequest request){

        JSONObject param = request.getJO();

        addPrevMonthString(param, "DATE_END");
        checkNull(param, "DEPT_ID", "DATE_END","DATE_START");

        return customComplainReportDao.customPlainSatisfaction(param);
    }

    /***
     * 客诉率
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  CAR_NUMBER 车流量
     *  COMPLAIN_NUM 客诉量
     */
    public JSONArray customPlainRate(SimpleRequest request){

        JSONObject param = request.getJO();

        checkNull(param, "DEPT_ID", "DATE_START", "DATE_END");

        return customComplainReportDao.customPlainRate(param);
    }


    /***
     * 客诉类别/类型
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  DATE_END 下月
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  COMPLAIN_CATEGORY_NAME 投诉类别
     *  NUM 数量
     */
    public JSONArray customPlainType(SimpleRequest request){

        JSONObject param = request.getJO();

        addPrevMonthString(param, "DATE_END");
        checkNull(param, "DEPT_ID", "DATE_END","DATE_START");

        return customComplainReportDao.customPlainType(param);
    }

    /***
     * 客诉排名-数量
     * 参数：
     *  DATE_END 下月
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  CUR_COMPLAIN_NUM 数量
     *  PREV_COMPLAIN_NUM 上月数量
     *  DEPT_NAME 门店名称
     */
    public JSONArray customPlainCountRank(SimpleRequest request){

        JSONObject param = request.getJO();

        addPrevMonthString(param, "DATE_END");
        checkNull(param, "DATE_END","DATE_START");

        return customComplainReportDao.customPlainCountRank(param);
    }



    /***
     * 客诉排名-原因
     * 参数：
     *  DATE_END 下月
     *
     * 返回值：
     *  INITIAT_OA_DATE 日期 （yyyy-mm）
     *  COMPLAIN_CATEGORY_NAME 投诉类别
     *  CUR_COMPLAIN_NUM 数量
     *  PREV_COMPLAIN_NUM 上月数量
     */
    public JSONArray customPlainReasonRank(SimpleRequest request){

        JSONObject param = request.getJO();

        addPrevMonthString(param, "DATE_END");
        checkNull(param,"DATE_END","DATE_START");

        return customComplainReportDao.customPlainReasonRank(param);
    }



    /***
     * 用于验证参数不能为空
     */
    private void checkNull(JSONObject param, String... items){
        for (String field : items) {
            if (param.get(field) == null) throw new RuntimeException("参数：" + field + "不能为空");
            if (field.equals("DATE_START") || field.equals("DATE_END")) {
                param.put(field, convertDateToString(param, field));
            }
        }
    }


    /***
     * 转日期为字符串
     */
    private String convertDateToString(JSONObject param, String field){
        Date date = DateUtil.parseUTC(param.getString(field));
        return DateUtil.format(date, DateUtil.SHOW_MONTH_FORMAT);
    }

    /***
     * 获取上个月的字符串
     */
    private void addPrevMonthString(JSONObject param, String field){
        Date date = DateUtil.parseUTC(param.getString(field));
        date = DateUtil.add(date, Calendar.MONTH, -1);
        param.put("DATE_START", DateUtil.format(date, DateUtil.SHOW_DATETIME_UTC_FORMAT)) ;
    }

}
